#include <fstream>
#include <iostream>
#include <string.h>
#include <sstream>
#include <vector>
// #include <bits/stdc++.h>

// 1. 从文件中读取数据
void file_read(std::string& file, std::string mode) {
    FILE* f = fopen(file.c_str(), mode.c_str());

    if (f == NULL) {
        std::cerr << "File open error!" << std::endl;
        return;
    }

    char buf[500];
    std::string str;
    // buf[2048]即每行不超过2048个字节，2表示每次只读2个字节，f为文件指针
    while (fgets(buf, 500, f)) {   //! 可以写大一些， 最多只会读取一行
        // std::string str(buf);
        str = buf;
        std::cout << str;          //! 转换成string过后, 再使用sstream进行切分
        // printf("=======\n");
    }
    std::cout << std::endl;
    fclose(f);
}

#define N 2

// 2. 写入数据到文件
struct Book {
    char name[10];
    int num;
    int year;
} booka[N], bookb[N], *pa, *pb;

void file_write(std::string& file, std::string mode) {
    FILE *fp;
    int i;
    pa = booka;
    pb = bookb;
    if((fp=fopen(file.c_str(), mode.c_str())) == NULL) {
        puts("Fail to open file!");
        exit(0);
    }
 
    printf("输入数据：书名，数量，入馆年份:\n");
    for(i = 0; i < N; i++, pa++){     
        scanf("%s %d %d", pa->name, &pa->num, &pa->year);        // 从键盘读入数据，保存到booka
    }
    
    pa = booka;
    for(i=0; i<N; i++,pa++){     
        fprintf(fp,"%s %d %d\n", pa->name, pa->num, pa->year);   // 将booka中的数据写入到文件
    }
    
    rewind(fp);                                                  // 重置文件指针到文件头部
    for(i = 0; i < N; i++, pb++){                                // 从文件中读取数据，保存到bookb
        fscanf(fp, "%s %d %d\n", pb->name, &pb->num, &pb->year);
    }
    
    pb=bookb;
    for(i = 0; i < N; i++, pb++){                                // 将bookb中的数据输出到显示器
        printf("%s  %d  %d\n", pb->name, pb->num, pb->year);
    }
    fclose(fp);
}

int main(int argc, const char** argv) {
    // std::string  txt_file = "vector.txt";
    // file_read(txt_file, "r");

    std::string book_file = "book.txt";
    file_write(book_file, "wt+");                //! t代表文本模式, 文件系统可能会对换行符进行特殊处理

    return 0;
}